//
// Description: 根据运动员预测，给出各自名次
// Created by Loading on 2021/3/7.
//

// A选手说：B第二，我第三；
// B选手说：我第二，E第四；
// C选手说：我第一，D第二；
// D选手说：C最后，我第三；
// E选手说：我第四，A第一；
// 比赛结束后，恰好每位选手都说对了一半，请用编程实现他们的名次

#include <bits/stdc++.h>

using namespace std;

void violence() {
    int a, b, c, d, e;
    //每个选手取得的名次都是未知的，所以这种情况下，每个选手都进行一次循环，循环的范围就是可能取得名次的范围
    for (a = 1; a <= 5; a++) {
        for (b = 1; b <= 5; b++) {
            for (c = 1; c <= 5; c++) {
                for (d = 1; d <= 5; d++) {
                    for (e = 1; e <= 5; e++) {
                        //当同时满足每个人说对一半时，条件成立，跳出循环，输出结果
                        if (((b == 2) + (a == 3) == 1) &&
                            ((b == 2) + (e == 4) == 1) &&
                            ((c == 1) + (d == 2) == 1) &&
                            ((c == 5) + (d == 3) == 1) &&
                            ((e == 4) + (a == 1) == 1)) {
                            //如果就按以上步骤去输出结果的话你会发现，输出了多种结果，如图1所示（在下面），这是因为每个名次只能有一位选手取得，这一点我们没有考虑到，
                            /* 如果让每位选手取得的成绩相乘（1*2*3*4*5）恰好等于120，这时候结果就唯一了 */
                            if (a * b * c * d * e == 120) {
                                cout << "A:" << a << endl;
                                cout << "B:" << b << endl;
                                cout << "C:" << c << endl;
                                cout << "D:" << d << endl;
                                cout << "E:" << e << endl;
                            }
                        }
                    }
                }
            }
        }
    }
}

void usePermutation() {
    int ranks[5] = {1, 2, 3, 4, 5};
    char names[5] = {'A', 'B', 'C', 'D', 'E'};
    do {
        if ((ranks[0] == 3) + (ranks[1] == 2) == 1 && /* 每位选手只预测对了一半，所以两个预测相加恰好等于1 */
            (ranks[1] == 2) + (ranks[4] == 4) == 1 &&
            (ranks[2] == 1) + (ranks[3] == 2) == 1 &&
            (ranks[2] == 5) + (ranks[3] == 3) == 1 &&
            (ranks[4] == 4) + (ranks[0] == 1) == 1) {
            int i = 0;
            for (auto rank : ranks) {
                cout << names[i++] << ":" << rank << endl;
            }
        }
    } while (next_permutation(ranks, ranks + 5));
}

int main() {
    clock_t starttime = clock();
    violence();
    clock_t endtime = clock();
    cout << "暴力耗时：" << (double) (endtime - starttime) / CLOCKS_PER_SEC * 1000 << "毫秒" << endl;
    starttime = clock();
    usePermutation();
    endtime = clock();
    cout << "排列组合耗时：" << (double) (endtime - starttime) / CLOCKS_PER_SEC * 1000 << "毫秒" << endl;
}